package org.iamd.security;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * Utility клас за store-ването на уникалното за потребителя id. Използва се при
 * връщането на текущия потребителски контекст. В контейнера могат да се добавят
 * и премахват уникални идентификатори, като по този начин се променя контекста
 * в рамките на нишката.
 * 
 * @author И. Атанасов
 */
public class AccessContext {

	/** Holder за текущата нишка. */
	private static ThreadLocal<AccessContext> holder = new ThreadLocal<AccessContext>();

	/**
	 * @return контекста за текущата нишка. Ако няма такъв - създава нов.
	 */
	public static AccessContext get() {
		AccessContext value = holder.get();
		if (value == null) {
			value = new AccessContext();
			holder.set(value);
		}
		return value;
	}

	/** Списък от идентификатори на логнати потребители. */
	private List<UUID> uniqueIds;

	/**
	 * Инстанциране на списъка с уникалните идентификатори.
	 */
	private AccessContext() {
		this.uniqueIds = new ArrayList<UUID>();
	}

	/**
	 * @return уникален идентификатор, последния в списъка
	 */
	public UUID getUniqueId() {
		return this.uniqueIds.get(this.uniqueIds.size() - 1);
	}

	/**
	 * Премахване на последния идентификатор от списъка
	 */
	public synchronized void popUniqueId() {
		if (!this.uniqueIds.isEmpty()) {
			this.uniqueIds.remove(this.uniqueIds.size() - 1);
		}
	}

	/**
	 * Добавяне на на идентификатор към списъка с такива.
	 * 
	 * @param uniqueId
	 *            уникален идентификатор
	 */
	public synchronized void pushUniqueId(UUID uniqueId) {
		this.uniqueIds.add(uniqueId);
	}

}